package top.dingwen.io.treasure.websocket.core.holder;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.web.socket.WebSocketSession;
import top.dingwen.io.treasure.base.constant.SupWarsConstant;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * WebSocketSession 用于保存当前所有在线的会话信息
 *
 * @author dingwen
 * @since 2024/10/16
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@SuppressWarnings(SupWarsConstant.UNUSED)
public class WebSocketSessionHolder {

    /**
     * 用于存储所有在线用户的WebSocket会话
     */
    private static final Map<String, WebSocketSession> SESSIONS = new ConcurrentHashMap<>();

    /**
     * 用于存储所有在线会话的键及最后活跃时间
     */
    private static final Map<String, Long> ACTIVE_SESSIONS = new ConcurrentHashMap<>();

    /**
     * 获取所有在线用户的WebSocket会话
     * @return {@link Collection }<{@link WebSocketSession }>
     */
    public static Map<String, WebSocketSession> getSessionsAll() {
        return SESSIONS;
    }
    /**
     * 获取所有在线会话的键及最后活跃时间
     *
     * @return {@link Map }<{@link String }, {@link Long }> 所有在线会话的键及最后活跃时间
     */
    public static Map<String, Long> getActiveSessions() {
        return ACTIVE_SESSIONS;
    }

    /**
     * 更新指定WebSocket会话的活跃时间
     *
     * @param sessionKey 会话键
     */
    public static void updateActiveTime(String sessionKey) {
        ACTIVE_SESSIONS.put(sessionKey, System.currentTimeMillis());
    }

    /**
     * 将WebSocket会话添加到用户会话Map中
     *
     * @param sessionKey 会话键，用于检索会话
     * @param session    要添加的WebSocket会话
     */
    public static void addSession(String sessionKey, WebSocketSession session) {
        SESSIONS.put(sessionKey, session);
        ACTIVE_SESSIONS.put(sessionKey, System.currentTimeMillis());
    }

    /**
     * 从用户会话Map中移除指定会话键对应的WebSocket会话
     *
     * @param sessionKey 要移除的会话键
     */
    public static void removeSession(String sessionKey) {
        SESSIONS.remove(sessionKey);
        ACTIVE_SESSIONS.remove(sessionKey);
    }

    /**
     * 根据会话键从用户会话Map中获取WebSocket会话
     *
     * @param sessionKey 要获取的会话键
     * @return 与给定会话键对应的WebSocket会话，如果不存在则返回null
     */
    public static WebSocketSession getSessions(String sessionKey) {
        return SESSIONS.get(sessionKey);
    }

    /**
     * 获取存储在用户会话Map中所有WebSocket会话的会话键集合
     *
     * @return 所有WebSocket会话的会话键集合
     */
    public static Set<String> getSessionKeysAll() {
        return SESSIONS.keySet();
    }

    /**
     * 检查给定的会话键是否存在于用户会话Map中
     *
     * @param sessionKey 要检查的会话键
     * @return 如果存在对应的会话键，则返回true；否则返回false
     */
    public static Boolean existSession(String sessionKey) {
        return SESSIONS.containsKey(sessionKey);
    }
}
